﻿using System;
using System.ComponentModel;

namespace BlueSky.Common
{
    public class Convertors
    {
        /// <summary>
        /// See Convert.ChangeType.
        /// </summary>
        /// <typeparam name="T">New type, may be Nullable.</typeparam>
        /// <param name="value">Object</param>
        /// <returns>Typed object.</returns>
        public static T ChangeType<T>(object value)
        {
            Type conversionType = typeof(T);

            if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
            {
                if (value == null)
                {
                    return default(T);
                }
                else
                {
                    NullableConverter nullableConverter = new NullableConverter(conversionType);
                    conversionType = nullableConverter.UnderlyingType;
                }
            }
            return (T)Convert.ChangeType(value, conversionType);
        }
    }
}
